带权并查集.
维护一个带权并查集, 用 $ans(x)$ 表示 $x$ 到 $x$ 的根节点路径权值异或和.
得到一个信息 $(s,t,w)$ 后,若 $s,t$ 不在同一并查集,则将两个并查集合并,并打上标记.
否则,检查 $ans(s)\oplus ans(t)$ 是否为 $t$ ,若不为 $t$ ,说明不合法.
最后若并查集数目 $>1$ ,说明有多解,否则将每个点的 $ans$ 求出后即可得到答案.
1 | //%std |
夢はここに 思い出は遠くに
带权并查集.
维护一个带权并查集, 用 $ans(x)$ 表示 $x$ 到 $x$ 的根节点路径权值异或和.
得到一个信息 $(s,t,w)$ 后,若 $s,t$ 不在同一并查集,则将两个并查集合并,并打上标记.
否则,检查 $ans(s)\oplus ans(t)$ 是否为 $t$ ,若不为 $t$ ,说明不合法.
最后若并查集数目 $>1$ ,说明有多解,否则将每个点的 $ans$ 求出后即可得到答案.
1 | //%std |